/*
 *  Copyright 2009 Jamie Gennis <jgennis@gmail.com>.
 * 
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 * 
 *       http://www.apache.org/licenses/LICENSE-2.0
 * 
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *  under the License.
 */

package com.google.code.gwt.remoteaction.batch.client;

import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DeferredCommand;
import com.google.inject.Inject;

/**
 * A batching action filter that defers execution of actions until all events
 * have been handled via the
 * {@link DeferredCommand#addCommand(com.google.gwt.user.client.Command)}
 * method.
 * 
 * @author Jamie Gennis <jgennis@gmail.com>
 */
public class DeferredBatchingActionFilter extends AbstractBatchingActionFilter {

  /**
   * Construct a new {@code DeferredBatchingActionFilter}.
   */
  @Inject
  public DeferredBatchingActionFilter() {
  }

  /**
   * Construct a new {@code DeferredBatchingActionFilter} with a given action
   * batch execution service.
   * 
   * This constructor is primarily for testing purposes.
   * 
   * @param actionBatchExecutor the action batch execution service
   */
  protected DeferredBatchingActionFilter(ActionBatchExecutionServiceAsync actionBatchExecutor) {
    super(actionBatchExecutor);
  }

  /**
   * Enqueue a {@link DeferredCommand} that will call
   * {@link AbstractBatchingActionFilter#flush()} once all pending events have
   * been handled.
   */
  protected void deferFlush() {
    DeferredCommand.addCommand(new Command() {

      @Override
      public void execute() {
        flush();
      }
    });
  }
}
